首先公佈下昨天課後練習的解答:
def hidePassword(psd):
    return "*" * len(psd)
你答對了嗎?
字串是程式語言中一種常用的資料型態,
工程師也常常需要與字串打交道,
熟悉字串則程式功力必定大增,
今天來給大家介紹字串幾個常用的函數。
| 函數 | 說明 | 
|---|---|
| s.split() | 默認以空格、換行字元分割字串s,返回列表 | 
| s.join(seq) | 以s為分隔符,將seq中的元素串起來成為一個新的字串 | 
S1 = "Horse-Horse-Tiger-Tiger"
print(S.split('-')) #['Horse', 'Horse', 'Tiger', 'Tiger']
print(S.split('Horse')) #['', '-', '-Tiger-Tiger']
S2 = "three     monkey   jumping  on the    bed"
print(S2.split()) #['three', 'monkey', 'jumping', 'on', 'the', 'bed']
print(S2.split(' ')) #['three', '', '', '', '', 'monkey', '', '', 'jumping', '', 'on', 'the', '', '', '', 'bed']
這邊注意S2.split()和S2.split(' ')是不一樣的,
如果原始字串有多個空格,S2.split()會將多餘的空字元去除,
但S2.split(' ')會分割出許多空字元,
一般來說,以空格分割字串直接用S2.split()即可。
seq = ["HOW", "ARE", "YOU"]
print(' '.join(seq)) # 印出 HOW ARE YOU
print('-'.join(seq)) # 印出 HOW-ARE-YOU
假設我們有一個列表,裡面元素都是字串,
現在想要把列表內字串一行一行的印出來怎麼做呢?
舉例來說,
假設L=["Alice", "Bob", "Car"],
希望結果印出:AliceBobCar
最常見也最容易想的方法大概就是for迴圈了:
for s in L:
    print(s)
還有沒有其它方法呢?
這時就要用到join()了:
print('\n'.join(L))
哇,這是什麼不可思議的語法,連迴圈都省了?
首先\n是特殊字元,代表換行的意思,
因此用\n換行字元把列表裡的字串接起來,
自然就可以換行印囉。
| 函數 | 說明 | 
|---|---|
| s.find(str) | 返回str第一次在字串s中出現的index,若找不到則返回-1 | 
| s.count(str) | 返回str在字串s中出現的次數 | 
s = "believe"
print(s.find("lie")) #印出2
print(s.find("le"))  #印出-1
| 函數 | 說明 | 
|---|---|
| s.replace(str1, str2) | 將s中的str1替換成str2 | 
s1 = "ABBABBAAAB"
print(s1.replace('A','C')) #印出 CBBCBBCCCB
s2 = "wowwwowowoo"
print(s2.replace('wow','HO')) #印出HOwHOowoo
文末將會提一個巧妙運用哦,請期待。
| 函數 | 說明 | 
|---|---|
| s.lower() | 將字串s裡的字母全部改成小寫 | 
| s.upper() | 將字串s裡的字母全部改成大寫 | 
| s.swapcase() | 將字串s的字母大小寫翻轉 | 
| s.lstrip() | 去除字串s左邊的空格 | 
| s.rstrip() | 去除字串s右邊的空格 | 
| s.strip() | 去除字串s左、右兩邊的空格 | 
| s.center(width) | 返回一個居中的字串,將左右兩邊填充至長度width | 
我們再Day5時做過這個範例,
在螢幕上顯示7階的金字塔,如下:
      *
     ***
    *****
   *******
  *********
 ***********
*************
你可能覺得數每一個星星前有幾個空格有點麻煩,
這邊再提供一種不一樣的思維來做。
首先,金字塔的底部有2*7-1=13顆星星,
第i行需要印的星星數= 2*i -1,
那麼我們就把每行的字串長串都填充到13,
再把它置中就好了啊,程式碼如下:
for i in range(1,8):
    print(('*' * (2*i-1)).center(13))
| 函數 | 說明 | 
|---|---|
| s.islower() | 判斷字串s的字母是否全由小寫字母組成 | 
| s.isupper() | 判斷字串s的字母是否全由大寫字母組成 | 
| s.isdigit() | 判斷字串s是否全由數字組成 | 
| s.isalpha() | 判斷字串s是否全由字母組成 | 
| s.isalnum() | 判斷字串s是否全由字母及數字組成 | 
呼叫上述函式的結果都是返回True或False的布林值,
注意若s是空字串,上述結果會返回False。
好了,關於字串常用函數就介紹到這邊了,
沒介紹到的函數大概相對也比較少用吧。
參考資料: 菜鳥教程
假設給你一個單字animal,
我們希望把英文的母音(a,e,i,o,u)都去除,
想要得到結果nml,
你會怎麼做呢?
先上個普通想法:
既然是去除,
很多人直覺可能會想到先查一下字串有沒有類似列表的remove()函數可以用,
結果一查…
居然沒有…
於是有些人可能會想到說,
那我是不是可以先把字串轉換成列表,
調用列表的remove()函數,
再用字串的join()函數轉回字串呢?
例如:
>>> list('animal')
['a', 'n', 'i', 'm', 'a', 'l']
使用list()可以把字串轉換成每個字元是一個元素的列表。
一次去除所有母音好像不太好想,
我們先試做去除字母a的函數:
def removeVowel(word):
    L = list(word)
    while 'a' in L:
        L.remove('a')
    return ''.join(L)
print(removeVowel('animal')) #印出 niml
好的,恭喜你,現在已經可以去除單字裡的字母a了。
可是母音總共有五個,如果改成五個while迴圈:
def removeVowel(word):
    L = list(word)
    while 'a' in L:
        L.remove('a')
    while 'e' in L:
        L.remove('e')
    while 'i' in L:
        L.remove('i')
    while 'o' in L:
        L.remove('o')
    while 'u' in L:
        L.remove('u')
    return ''.join(L)
    
print(removeVowel('animal')) #印出 nml
可以得到正確的結果,但是也太冗長了吧?
仔細瞧,其實五個while迴圈做的事都是類似的,
可以改以for迴圈簡化它:
def removeVowel(word):
    L = list(word)
    for letter in 'aeiou':
        while letter in L:
            L.remove(letter)
    return ''.join(L)
嗯,現在看起來好多了,
然而底下以替換的思想完成去除這件事,
才堪稱是巧思啊!
這個想法是依序把a,e,i,o,u這五個字,把它替換成空字元:
def removeVowel(word):
    for letter in 'aeiou':
        word = word.replace(letter,'')
    return word
把字元替換成空字元,
那麼那個字也不會印出來了,
也就相當於達成去除的效果。
有學過程式語言的人都知道,
幫變數取名稱有一定的限制,不能任意亂取。
一個合法的變法名稱可以由字母、數字和'_'組成,
但是開頭不可以是數字。
那麼給你一個字串,
能否讓程式來判斷這個字串是否可以當作合法的變數名稱呢?
請實作函數isLegal(s),
def isLegal(s):
    return #這邊輸入你要回傳的值
參數s表示一個非空字串,
請回傳True 或 False表示s是否可做為合法的變數名稱。
提示想法如下:
合法的命名需滿足三條件:
import re
def isLegal(s):
    regex = r"^[a-zA-Z_]\w+$"
    if tuple(re.finditer(regex, s)):
        return True
    return False